package cn.caplike.demo.netty.http.channel;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;

/**
 * Description: http 请求 <a href="http://127.0.0.1:8899">http://127.0.0.1:8899</a>
 *
 * @author LiKe
 * @version 1.0.0
 * @date 2021-11-26 17:34
 */
public class TestServer {

    // 一个 EventLoopGroup 中会包含一个或者多个 EventLoop
    // 一个 EventLoop 在其生命周期中只会与唯一一个 Thread 绑定: SingleThreadEventExecutor
    // 所有由 EventLoop 所处理的各种 IO 事件都将在它所绑定的那个 Thread 中处理
    // 一个 Channel 在其生命周期中只会注册在一个 EventLoop 上: 所以其 Handler 方法不会有多线程问题
    // 一个 EventLoop 在运行过程中, 会被分配给一个或者多个 Channel. EventLoop 多对一 Channel

    public static void main(String[] args) throws InterruptedException {
        // ~ 定义两个线程组, 其实就是两个死循环
        final EventLoopGroup parentGroup = new NioEventLoopGroup(); // 不断的接收客户端连接, 转给 childGroup
        final EventLoopGroup childGroup = new NioEventLoopGroup(); // 真正完成对连接的处理, 响应给 client

        try {
            // 启动服务端
            final ServerBootstrap serverBootstrap = new ServerBootstrap();
            serverBootstrap.group(parentGroup, childGroup).channel(NioServerSocketChannel.class)
                // ~ 子处理器, 真正的处理请求
                .childHandler(new TestServerChannelInitializer());

            final ChannelFuture channelFuture = serverBootstrap.bind(8899)/*ChannelFuture*/.sync();
            channelFuture.channel().closeFuture().sync();
        } finally {
            parentGroup.shutdownGracefully();
            childGroup.shutdownGracefully();
        }
    }

}
